Title: [282054] trunk
Revision
282054
Author
[email protected]
Date
2021-09-06 01:49:02 -0700 (Mon, 06 Sep 2021)

Log Message

Implement libwebrtc network manager GetMdnsResponder
https://bugs.webkit.org/show_bug.cgi?id=229757

Reviewed by Eric Carlson.

Source/WebCore:

Use libwebrtc mDNS support instead of applying it within PeerConnectionBackend.
This allows a better integration and is more consistent with the API and other browsers.
For instance mDNS candidates now show up in local descriptions.
We introduce RTCNetworkManager which is responsible for WebRTC network.
RTCNetworkManager is responsible of all peer connections of a document. It can thus reuse mDNS names from one connection to another.
When document goes away, RTCNetworkManager needs to unregister all mDNS names.
Update existing SDP and ICE candidate filtering code by only keeping debug assert that we do not leak private IP addresses in case ICE filtering is on.
WK1 does not support mDNS candidates. In that case, we expose private IP addresses.

Covered by updated and existing tests.

* Headers.cmake:
* Modules/mediastream/PeerConnectionBackend.cpp:
(WebCore::PeerConnectionBackend::createOfferSucceeded):
(WebCore::PeerConnectionBackend::enableICECandidateFiltering):
(WebCore::PeerConnectionBackend::disableICECandidateFiltering):
(WebCore::PeerConnectionBackend::validateSDP const):
(WebCore::PeerConnectionBackend::newICECandidate):
(WebCore::PeerConnectionBackend::doneGatheringCandidates):
* Modules/mediastream/PeerConnectionBackend.h:
* Modules/mediastream/RTCController.cpp:
(WebCore::RTCController::add):
(WebCore::RTCController::disableICECandidateFilteringForAllOrigins):
(WebCore::RTCController::disableICECandidateFilteringForDocument):
(WebCore::RTCController::enableICECandidateFiltering):
* Modules/mediastream/RTCNetworkManager.h: Added.
* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
(WebCore::LibWebRTCMediaEndpoint::setConfiguration):
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
(WebCore::LibWebRTCPeerConnectionBackend::currentLocalDescription const):
(WebCore::LibWebRTCPeerConnectionBackend::pendingLocalDescription const):
(WebCore::LibWebRTCPeerConnectionBackend::localDescription const):
* WebCore.xcodeproj/project.pbxproj:
* dom/Document.cpp:
(WebCore::Document::willBeRemovedFromFrame):
(WebCore::Document::suspend):
* dom/Document.h:
(WebCore::Document::rtcNetworkManager):
(WebCore::Document::setRTCNetworkManager):
* platform/mediastream/MDNSRegisterError.h: Added.
* platform/mediastream/libwebrtc/LibWebRTCProvider.cpp:
(WebCore::LibWebRTCProvider::createPeerConnection):
* platform/mediastream/libwebrtc/LibWebRTCProvider.h:

Source/WebKit:

Implement RTCNetworkManager API in LibWebRTCNetworkManager to handle per-document mDNS registrations.
Move part of WebRTCMonitor to LibWebRTCNetworkManager.
LibWebRTCNetworkManager is a WebRTCMonitor observer to get the list of networks.
Since libwebrtc is now doing the mDNS registration, we need to return a mDNS name even if registration failed.
We update WebMDNSRegister and NetworkMDNSRegister accordingly.

* NetworkProcess/webrtc/NetworkMDNSRegister.cpp:
(WebKit::registerMDNSNameCallback):
(WebKit::NetworkMDNSRegister::registerMDNSName):
* Sources.txt:
* WebKit.xcodeproj/project.pbxproj:
* WebProcess/Network/webrtc/LibWebRTCNetworkManager.cpp: Added.
(WebKit::LibWebRTCNetworkManager::getOrCreate):
(WebKit::LibWebRTCNetworkManager::LibWebRTCNetworkManager):
(WebKit::LibWebRTCNetworkManager::~LibWebRTCNetworkManager):
(WebKit::LibWebRTCNetworkManager::unregisterMDNSNames):
(WebKit::LibWebRTCNetworkManager::StartUpdating):
(WebKit::LibWebRTCNetworkManager::StopUpdating):
(WebKit::LibWebRTCNetworkManager::GetMdnsResponder const):
(WebKit::LibWebRTCNetworkManager::networksChanged):
(WebKit::LibWebRTCNetworkManager::networkProcessCrashed):
(WebKit::LibWebRTCNetworkManager::CreateNameForAddress):
(WebKit::LibWebRTCNetworkManager::RemoveNameForAddress):
* WebProcess/Network/webrtc/LibWebRTCNetworkManager.h: Added.
* WebProcess/Network/webrtc/LibWebRTCProvider.cpp:
(WebKit::LibWebRTCProvider::createPeerConnection):
(WebKit::LibWebRTCProvider::disableNonLocalhostConnections):
* WebProcess/Network/webrtc/LibWebRTCProvider.h:
* WebProcess/Network/webrtc/WebMDNSRegister.cpp:
(WebKit::WebMDNSRegister::finishedRegisteringMDNSName):
(WebKit::WebMDNSRegister::registerMDNSName):
* WebProcess/Network/webrtc/WebMDNSRegister.h:
* WebProcess/Network/webrtc/WebMDNSRegister.messages.in:
* WebProcess/Network/webrtc/WebRTCMonitor.cpp:
(WebKit::WebRTCMonitor::startUpdating):
(WebKit::WebRTCMonitor::stopUpdating):
(WebKit::WebRTCMonitor::networksChanged):
(WebKit::WebRTCMonitor::networkProcessCrashed):
* WebProcess/Network/webrtc/WebRTCMonitor.h:
(WebKit::WebRTCMonitor::addObserver):
(WebKit::WebRTCMonitor::removeObserver):
(WebKit::WebRTCMonitor::didReceiveNetworkList const):
(WebKit::WebRTCMonitor::networkList const):
(WebKit::WebRTCMonitor::ipv4 const):
(WebKit::WebRTCMonitor::ipv6 const):

LayoutTests:

Update tests given mDNS ICE candidates are now showing up in descriptions.
Make sure to consider mDNS candidates as if they are filtered.

* http/wpt/webrtc/resources/third-party-frame-ice-candidate-filtering-iframe.html:
* webrtc/datachannel/filter-ice-candidate.html:
* webrtc/filtering-ice-candidate-after-reload.html:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (282053 => 282054)


--- trunk/LayoutTests/ChangeLog	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/LayoutTests/ChangeLog	2021-09-06 08:49:02 UTC (rev 282054)
@@ -1,3 +1,17 @@
+2021-09-06  Youenn Fablet  <[email protected]>
+
+        Implement libwebrtc network manager GetMdnsResponder
+        https://bugs.webkit.org/show_bug.cgi?id=229757
+
+        Reviewed by Eric Carlson.
+
+        Update tests given mDNS ICE candidates are now showing up in descriptions.
+        Make sure to consider mDNS candidates as if they are filtered.
+
+        * http/wpt/webrtc/resources/third-party-frame-ice-candidate-filtering-iframe.html:
+        * webrtc/datachannel/filter-ice-candidate.html:
+        * webrtc/filtering-ice-candidate-after-reload.html:
+
 2021-09-06  Kimmo Kinnunen  <[email protected]>
 
         webgl/1.0.x/conformance/context/constants-and-properties.html fails

Modified: trunk/LayoutTests/http/tests/webrtc/resources/check-ice-candidate-filtering.html (282053 => 282054)


--- trunk/LayoutTests/http/tests/webrtc/resources/check-ice-candidate-filtering.html	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/LayoutTests/http/tests/webrtc/resources/check-ice-candidate-filtering.html	2021-09-06 08:49:02 UTC (rev 282054)
@@ -14,7 +14,8 @@
                 resolve(candidates);
                 return;
             }
-            candidates.push(event.candidate.candidate);
+            if (event.candidate.candidate.indexOf('.local') === -1)
+                candidates.push(event.candidate.candidate);
         };
         pc.createOffer().then((offer) => {
             pc.setLocalDescription(offer);

Modified: trunk/LayoutTests/http/wpt/webrtc/resources/third-party-frame-ice-candidate-filtering-iframe.html (282053 => 282054)


--- trunk/LayoutTests/http/wpt/webrtc/resources/third-party-frame-ice-candidate-filtering-iframe.html	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/LayoutTests/http/wpt/webrtc/resources/third-party-frame-ice-candidate-filtering-iframe.html	2021-09-06 08:49:02 UTC (rev 282054)
@@ -12,7 +12,8 @@
                 resolve(!candidates.length);
                 return;
             }
-            candidates.push(event.candidate.candidate);
+            if (event.candidate.candidate.indexOf('.local') === -1)
+                candidates.push(event.candidate.candidate);
         };
         pc.createOffer().then((offer) => {
             pc.setLocalDescription(offer);

Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (282053 => 282054)


--- trunk/LayoutTests/platform/mac-wk1/TestExpectations	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations	2021-09-06 08:49:02 UTC (rev 282054)
@@ -390,6 +390,7 @@
 http/wpt/webrtc [ Skip ]
 webrtc/datachannel [ Pass ]
 webrtc/datachannel/mdns-ice-candidates.html [ Skip ]
+webrtc/datachannel/filter-ice-candidate.html [ Skip ]
 imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html [ Failure ]
 
 imported/w3c/web-platform-tests/webrtc-encoded-transform [ Skip ]

Modified: trunk/LayoutTests/webrtc/datachannel/filter-ice-candidate.html (282053 => 282054)


--- trunk/LayoutTests/webrtc/datachannel/filter-ice-candidate.html	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/LayoutTests/webrtc/datachannel/filter-ice-candidate.html	2021-09-06 08:49:02 UTC (rev 282054)
@@ -8,68 +8,91 @@
   </head>
   <body>
     <script>
-promise_test((test) => {
-    return new Promise((resolve, reject) => {
-        setTimeout(() => { reject("Test timed out"); }, 5000);
+function ensureCandidatesAreMDNS(sdp)
+{
+    assert_true(sdp.indexOf("c=IN IP4 0.0.0.0\r\n") != -1 || sdp.indexOf("c=IN IP6 ::\r\n") != -1);
+    const candidates = sdp.split('\r\n').filter(line => {
+        return line.indexOf('a=candidate') !== -1;
+    });
+    for (const candidate of candidates)
+        assert_not_equals(candidate.indexOf('.local'), -1);
+}
 
-        if (window.internals)
-            internals.setICECandidateFiltering(true);
+function ensureCandidatesAreNotMDNS(sdp)
+{
+    const candidates = sdp.split('\r\n').filter(line => {
+        return line.indexOf('a=candidate') !== -1;
+    });
+    for (const candidate of candidates)
+        assert_equals(candidate.indexOf('.local'), -1);
+}
 
-        var counter = 0;
-        var pc = new RTCPeerConnection();
-        pc.createDataChannel('sendDataChannel');
-        pc._onicecandidate_ = (event) => {
-            if (event.candidate) {
-                counter++;
-                return;
-            }
-            assert_equals(pc.localDescription.sdp.indexOf("a=candidate"), -1);
-            assert_true(pc.localDescription.sdp.indexOf("c=IN IP4 0.0.0.0\r\n") != -1 || pc.localDescription.sdp.indexOf("c=IN IP6 ::\r\n") != -1);
-            if (counter === 0) {
-                pc.createOffer().then((offer) => {
-                    assert_true(offer.sdp.indexOf("c=IN IP4 0.0.0.0\r\n") != -1 || pc.localDescription.sdp.indexOf("c=IN IP6 ::\r\n") != -1);
-                    assert_equals(offer.sdp.indexOf("a=candidate"), -1);
-                    resolve();
-                });
-            } else
-                reject("No candidate should be found");
-        };
-        pc.createOffer().then((offer) => {
-            assert_equals(offer.sdp.indexOf("a=candidate"), -1);
-            pc.setLocalDescription(offer);
-        });
-    });
+promise_test(async (test) => {
+    let resolve, reject;
+    const promise = new Promise((res, rej) => { resolve = res; reject = rej; });
+    setTimeout(() => { reject("Test timed out"); }, 5000);
+
+    if (window.internals)
+        internals.setICECandidateFiltering(true);
+
+    let counter = 0;
+    let pc = new RTCPeerConnection();
+    pc.createDataChannel('sendDataChannel');
+    pc._onicecandidate_ = async (event) => {
+        if (event.candidate) {
+            assert_not_equals(event.candidate.candidate.indexOf('.local'), -1);
+            counter++;
+            return;
+        }
+        ensureCandidatesAreMDNS(pc.localDescription.sdp);
+        if (counter === 0) {
+            const offer = await pc.createOffer();
+            await pc.setLocalDescription(offer);
+            ensureCandidatesAreMDNS(pc.localDescription.sdp);
+            resolve();
+            return;
+        }
+        resolve();
+    };
+    const offer = await pc.createOffer();
+    assert_equals(offer.sdp.indexOf("a=candidate"), -1);
+    await pc.setLocalDescription(offer);
+
+    return promise;
 }, "Gathering ICE candidates from a data channel peer connection with ICE candidate filtering on");
 
-promise_test((test) => {
-    return new Promise((resolve, reject) => {
-        setTimeout(() => { reject("Test timed out"); }, 5000);
+promise_test(async (test) => {
+    let resolve, reject;
+    const promise = new Promise((res, rej) => { resolve = res; reject = rej; });
+    setTimeout(() => { reject("Test timed out"); }, 5000);
 
-	if (window.internals)
-            internals.setICECandidateFiltering(false);
+    if (window.internals)
+        internals.setICECandidateFiltering(false);
+ 
+    let counter = 0;
+    let pc = new RTCPeerConnection();
+    pc.createDataChannel('sendDataChannel');
 
-        var counter = 0;
-        var pc = new RTCPeerConnection();
-        pc.createDataChannel('sendDataChannel');
-        pc._onicecandidate_ = (event) => {
-            if (event.candidate) {
-                counter++;
-                return;
-            }
-            assert_true(pc.localDescription.sdp.indexOf("c=IN IP4 0.0.0.0\r\n") === -1 && pc.localDescription.sdp.indexOf("c=IN IP6 ::\r\n") === -1);
-            assert_false(pc.localDescription.sdp.indexOf("a=candidate") === -1);
-            if (counter !== 0) {
-                // Redoing an offer now that we have some candidates.
-                pc.createOffer().then((offer) => {
-                    assert_true(offer.sdp.indexOf("c=IN IP4 0.0.0.0\r\n") === -1 && pc.localDescription.sdp.indexOf("c=IN IP6 ::\r\n") === -1);
-                    assert_false(offer.sdp.indexOf("a=candidate") === -1);
-                    resolve();
-                });
-            } else
-                reject("Host candidates should be found");
-        };
-        pc.createOffer().then((offer) => { pc.setLocalDescription(offer); });
-    });
+    pc._onicecandidate_ = async (event) => {
+        if (event.candidate) {
+            assert_equals(event.candidate.candidate.indexOf('.local'), -1);
+            counter++;
+            return;
+        }
+        ensureCandidatesAreNotMDNS(pc.localDescription.sdp);
+        if (counter !== 0) {
+            // Redoing an offer now that we have some candidates.
+            const offer = await pc.createOffer();
+            await pc.setLocalDescription(offer);
+            ensureCandidatesAreNotMDNS(pc.localDescription.sdp);
+            resolve();
+        } else
+            reject("Host candidates should be found");
+    };
+    const offer = await pc.createOffer();
+    await pc.setLocalDescription(offer);
+
+    return promise;
 }, "Gathering ICE candidates from a data channel peer connection with ICE candidate filtering off");
 
 promise_test(async (test) => {

Modified: trunk/LayoutTests/webrtc/filtering-ice-candidate-after-reload.html (282053 => 282054)


--- trunk/LayoutTests/webrtc/filtering-ice-candidate-after-reload.html	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/LayoutTests/webrtc/filtering-ice-candidate-after-reload.html	2021-09-06 08:49:02 UTC (rev 282054)
@@ -7,24 +7,28 @@
     testRunner.waitUntilDone();
 }
 
-function isFilteringEnabled()
+async function isFilteringEnabled()
 {
+    let resolve, reject;
+    const promise = new Promise((res, rej) => { resolve = res; reject = rej; });
+    setTimeout(() => { reject("Test timed out"); }, 5000);
+
     var pc = new RTCPeerConnection();
     pc.createDataChannel("");
 
     var candidates = [];
-    return new Promise((resolve, reject) => {
-        pc._onicecandidate_ = (event) => {
-            if (event.candidate === null) {
-                resolve(!candidates.length);
-                return;
-            }
+    pc._onicecandidate_ = (event) => {
+        if (event.candidate === null) {
+            resolve(!candidates.length);
+            return;
+        }
+        if (event.candidate.candidate.indexOf('.local') === -1)
             candidates.push(event.candidate.candidate);
-        };
-        pc.createOffer().then((offer) => {
-            pc.setLocalDescription(offer);
-        });
-    });
+    };
+
+    const offer = await pc.createOffer();
+    await pc.setLocalDescription(offer);
+    return promise;
 }
 
 function endTest(message)

Modified: trunk/Source/WebCore/ChangeLog (282053 => 282054)


--- trunk/Source/WebCore/ChangeLog	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/ChangeLog	2021-09-06 08:49:02 UTC (rev 282054)
@@ -1,3 +1,54 @@
+2021-09-06  Youenn Fablet  <[email protected]>
+
+        Implement libwebrtc network manager GetMdnsResponder
+        https://bugs.webkit.org/show_bug.cgi?id=229757
+
+        Reviewed by Eric Carlson.
+
+        Use libwebrtc mDNS support instead of applying it within PeerConnectionBackend.
+        This allows a better integration and is more consistent with the API and other browsers.
+        For instance mDNS candidates now show up in local descriptions.
+        We introduce RTCNetworkManager which is responsible for WebRTC network.
+        RTCNetworkManager is responsible of all peer connections of a document. It can thus reuse mDNS names from one connection to another.
+        When document goes away, RTCNetworkManager needs to unregister all mDNS names.
+        Update existing SDP and ICE candidate filtering code by only keeping debug assert that we do not leak private IP addresses in case ICE filtering is on.
+        WK1 does not support mDNS candidates. In that case, we expose private IP addresses.
+
+        Covered by updated and existing tests.
+
+        * Headers.cmake:
+        * Modules/mediastream/PeerConnectionBackend.cpp:
+        (WebCore::PeerConnectionBackend::createOfferSucceeded):
+        (WebCore::PeerConnectionBackend::enableICECandidateFiltering):
+        (WebCore::PeerConnectionBackend::disableICECandidateFiltering):
+        (WebCore::PeerConnectionBackend::validateSDP const):
+        (WebCore::PeerConnectionBackend::newICECandidate):
+        (WebCore::PeerConnectionBackend::doneGatheringCandidates):
+        * Modules/mediastream/PeerConnectionBackend.h:
+        * Modules/mediastream/RTCController.cpp:
+        (WebCore::RTCController::add):
+        (WebCore::RTCController::disableICECandidateFilteringForAllOrigins):
+        (WebCore::RTCController::disableICECandidateFilteringForDocument):
+        (WebCore::RTCController::enableICECandidateFiltering):
+        * Modules/mediastream/RTCNetworkManager.h: Added.
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+        (WebCore::LibWebRTCMediaEndpoint::setConfiguration):
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+        (WebCore::LibWebRTCPeerConnectionBackend::currentLocalDescription const):
+        (WebCore::LibWebRTCPeerConnectionBackend::pendingLocalDescription const):
+        (WebCore::LibWebRTCPeerConnectionBackend::localDescription const):
+        * WebCore.xcodeproj/project.pbxproj:
+        * dom/Document.cpp:
+        (WebCore::Document::willBeRemovedFromFrame):
+        (WebCore::Document::suspend):
+        * dom/Document.h:
+        (WebCore::Document::rtcNetworkManager):
+        (WebCore::Document::setRTCNetworkManager):
+        * platform/mediastream/MDNSRegisterError.h: Added.
+        * platform/mediastream/libwebrtc/LibWebRTCProvider.cpp:
+        (WebCore::LibWebRTCProvider::createPeerConnection):
+        * platform/mediastream/libwebrtc/LibWebRTCProvider.h:
+
 2021-09-06  Kimmo Kinnunen  <[email protected]>
 
         webgl/1.0.x/conformance/context/constants-and-properties.html fails

Modified: trunk/Source/WebCore/Headers.cmake (282053 => 282054)


--- trunk/Source/WebCore/Headers.cmake	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/Headers.cmake	2021-09-06 08:49:02 UTC (rev 282054)
@@ -115,11 +115,14 @@
     Modules/mediastream/RTCDataChannel.h
     Modules/mediastream/RTCDataChannelRemoteHandler.h
     Modules/mediastream/RTCDataChannelRemoteSource.h
+    Modules/mediastream/RTCNetworkManager.h
     Modules/mediastream/STUNMessageParsing.h
     Modules/mediastream/UserMediaClient.h
     Modules/mediastream/UserMediaController.h
     Modules/mediastream/UserMediaRequest.h
 
+    Modules/mediastream/libwebrtc/LibWebRTCUtils.h
+
     Modules/model-element/HTMLModelElement.h
 
     Modules/notifications/Notification.h
@@ -1414,6 +1417,7 @@
 
     platform/mediastream/CaptureDevice.h
     platform/mediastream/CaptureDeviceManager.h
+    platform/mediastream/MDNSRegisterError.h
     platform/mediastream/MediaConstraints.h
     platform/mediastream/MediaStreamPrivate.h
     platform/mediastream/MediaStreamRequest.h

Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp (282053 => 282054)


--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -82,6 +82,11 @@
     , m_logIdentifier(peerConnection.logIdentifier())
 #endif
 {
+#if USE(LIBWEBRTC)
+    auto* document = peerConnection.document();
+    if (auto* page = document ? document->page() : nullptr)
+        m_shouldFilterICECandidates = page->libWebRTCProvider().isSupportingMDNS();
+#endif
 }
 
 PeerConnectionBackend::~PeerConnectionBackend() = default;
@@ -101,7 +106,8 @@
     ALWAYS_LOG(LOGIDENTIFIER, "Create offer succeeded:\n", sdp);
 
     ASSERT(m_offerAnswerPromise);
-    m_peerConnection.doTask([this, promise = WTFMove(m_offerAnswerPromise), sdp = filterSDP(WTFMove(sdp))]() mutable {
+    validateSDP(sdp);
+    m_peerConnection.doTask([this, promise = WTFMove(m_offerAnswerPromise), sdp = WTFMove(sdp)]() mutable {
         if (m_peerConnection.isClosed())
             return;
 
@@ -324,81 +330,19 @@
 void PeerConnectionBackend::disableICECandidateFiltering()
 {
     m_shouldFilterICECandidates = false;
-    for (auto& pendingICECandidate : m_pendingICECandidates)
-        fireICECandidateEvent(RTCIceCandidate::create(WTFMove(pendingICECandidate.sdp), WTFMove(pendingICECandidate.mid), pendingICECandidate.sdpMLineIndex), WTFMove(pendingICECandidate.serverURL));
-    m_pendingICECandidates.clear();
 }
 
-static String filterICECandidate(String&& sdp)
+void PeerConnectionBackend::validateSDP(const String& sdp) const
 {
-    ASSERT(!sdp.contains(" host "));
-
-    if (!sdp.contains(" raddr "))
-        return WTFMove(sdp);
-
-    bool skipNextItem = false;
-    bool isFirst = true;
-    StringBuilder filteredSDP;
-    sdp.split(' ', [&](StringView item) {
-        if (skipNextItem) {
-            skipNextItem = false;
-            return;
-        }
-        if (item == "raddr") {
-            filteredSDP.append(" raddr 0.0.0.0");
-            skipNextItem = true;
-            return;
-        }
-        if (item == "rport") {
-            filteredSDP.append(" rport 0");
-            skipNextItem = true;
-            return;
-        }
-        if (isFirst)
-            isFirst = false;
-        else
-            filteredSDP.append(' ');
-        filteredSDP.append(item);
-    });
-    return filteredSDP.toString();
-}
-
-String PeerConnectionBackend::filterSDP(String&& sdp) const
-{
+#ifndef NDEBUG
     if (!m_shouldFilterICECandidates)
-        return WTFMove(sdp);
-
-    StringBuilder filteredSDP;
-    sdp.split('\n', [this, &filteredSDP](StringView line) {
-        if (line.startsWith("c=IN IP4")) {
-            filteredSDP.append("c=IN IP4 0.0.0.0\r\n");
-            return;
-        }
-        if (line.startsWith("c=IN IP6")) {
-            filteredSDP.append("c=IN IP6 ::\r\n");
-            return;
-        }
-        if (!line.startsWith("a=candidate")) {
-            filteredSDP.append(line);
-            filteredSDP.append('\n');
-            return;
-        }
-        if (line.find(" host ", 11) == notFound) {
-            filteredSDP.append(filterICECandidate(line.toString()));
-            filteredSDP.append('\n');
-            return;
-        }
-
-        auto ipAddress = extractIPAddress(line);
-        auto mdnsName = m_ipAddressToMDNSNameMap.get(ipAddress);
-        if (mdnsName.isEmpty())
-            return;
-        auto sdp = line.toString();
-        sdp.replace(ipAddress, mdnsName);
-        filteredSDP.append(sdp);
-        filteredSDP.append('\n');
+        return;
+    sdp.split('\n', [](auto line) {
+        ASSERT(!line.startsWith("a=candidate") || line.contains(".local"));
     });
-    return filteredSDP.toString();
+#else
+    UNUSED_PARAM(sdp);
+#endif
 }
 
 void PeerConnectionBackend::newICECandidate(String&& sdp, String&& mid, unsigned short sdpMLineIndex, String&& serverURL)
@@ -408,22 +352,8 @@
         ALWAYS_LOG(logSiteIdentifier, "Gathered ice candidate:", sdp);
         m_finishedGatheringCandidates = false;
 
-        if (!m_shouldFilterICECandidates) {
-            fireICECandidateEvent(RTCIceCandidate::create(WTFMove(sdp), WTFMove(mid), sdpMLineIndex), WTFMove(serverURL));
-            return;
-        }
-        if (sdp.find(" host ", 0) != notFound) {
-            // FIXME: We might need to clear all pending candidates when setting again local description.
-            m_pendingICECandidates.append(PendingICECandidate { String { sdp }, WTFMove(mid), sdpMLineIndex, WTFMove(serverURL) });
-            if (RuntimeEnabledFeatures::sharedFeatures().webRTCMDNSICECandidatesEnabled()) {
-                auto ipAddress = extractIPAddress(sdp);
-                // We restrict to IPv4 candidates for now.
-                if (ipAddress.contains('.'))
-                    registerMDNSName(ipAddress);
-            }
-            return;
-        }
-        fireICECandidateEvent(RTCIceCandidate::create(filterICECandidate(WTFMove(sdp)), WTFMove(mid), sdpMLineIndex), WTFMove(serverURL));
+        ASSERT(!m_shouldFilterICECandidates || sdp.contains(".local"));
+        fireICECandidateEvent(RTCIceCandidate::create(WTFMove(sdp), WTFMove(mid), sdpMLineIndex), WTFMove(serverURL));
     });
 }
 
@@ -433,12 +363,8 @@
     ALWAYS_LOG(LOGIDENTIFIER, "Finished ice candidate gathering");
     m_finishedGatheringCandidates = true;
 
-    if (m_waitingForMDNSRegistration)
-        return;
-
     m_peerConnection.dispatchEventWhenFeasible(RTCPeerConnectionIceEvent::create(Event::CanBubble::No, Event::IsCancelable::No, nullptr, { }));
     m_peerConnection.updateIceGatheringState(RTCIceGatheringState::Complete);
-    m_pendingICECandidates.clear();
 }
 
 void PeerConnectionBackend::endOfIceCandidates(DOMPromiseDeferred<void>&& promise)
@@ -446,45 +372,6 @@
     promise.resolve();
 }
 
-void PeerConnectionBackend::registerMDNSName(const String& ipAddress)
-{
-    ++m_waitingForMDNSRegistration;
-    auto& document = downcast<Document>(*m_peerConnection.scriptExecutionContext());
-    auto& provider = document.page()->libWebRTCProvider();
-    provider.registerMDNSName(document.identifier(), ipAddress, [peerConnection = makeRef(m_peerConnection), this, ipAddress] (LibWebRTCProvider::MDNSNameOrError&& result) {
-        if (peerConnection->isStopped())
-            return;
-
-        --m_waitingForMDNSRegistration;
-        if (!result.has_value()) {
-            m_peerConnection.scriptExecutionContext()->addConsoleMessage(MessageSource::JS, MessageLevel::Warning, makeString("MDNS registration of a host candidate failed with error ", (unsigned)result.error()));
-            return;
-        }
-
-        this->finishedRegisteringMDNSName(ipAddress, result.value());
-    });
-}
-
-void PeerConnectionBackend::finishedRegisteringMDNSName(const String& ipAddress, const String& name)
-{
-    m_ipAddressToMDNSNameMap.add(ipAddress, name);
-    Vector<PendingICECandidate*> candidates;
-    for (auto& candidate : m_pendingICECandidates) {
-        if (candidate.sdp.find(ipAddress) != notFound) {
-            auto sdp = candidate.sdp;
-            sdp.replace(ipAddress, name);
-            fireICECandidateEvent(RTCIceCandidate::create(WTFMove(sdp), WTFMove(candidate.mid), candidate.sdpMLineIndex), WTFMove(candidate.serverURL));
-            candidates.append(&candidate);
-        }
-    }
-    m_pendingICECandidates.removeAllMatching([&] (const auto& candidate) {
-        return candidates.contains(&candidate);
-    });
-
-    if (!m_waitingForMDNSRegistration && m_finishedGatheringCandidates)
-        doneGatheringCandidates();
-}
-
 void PeerConnectionBackend::updateSignalingState(RTCSignalingState newSignalingState)
 {
     ASSERT(isMainThread());

Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (282053 => 282054)


--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h	2021-09-06 08:49:02 UTC (rev 282054)
@@ -207,7 +207,7 @@
     void addIceCandidateSucceeded();
     void addIceCandidateFailed(Exception&&);
 
-    String filterSDP(String&&) const;
+    void validateSDP(const String&) const;
 
     struct PendingTrackEvent {
         Ref<RTCRtpReceiver> receiver;
@@ -226,8 +226,6 @@
     virtual void endOfIceCandidates(DOMPromiseDeferred<void>&&);
     virtual void doStop() = 0;
 
-    void registerMDNSName(const String& ipAddress);
-
 protected:
     RTCPeerConnection& m_peerConnection;
 
@@ -236,24 +234,14 @@
     std::unique_ptr<DOMPromiseDeferred<void>> m_setDescriptionPromise;
 
     bool m_shouldFilterICECandidates { true };
-    struct PendingICECandidate {
-        // Fields described in https://www.w3.org/TR/webrtc/#idl-def-rtcicecandidateinit.
-        String sdp;
-        String mid;
-        unsigned short sdpMLineIndex;
-        String serverURL;
-    };
-    Vector<PendingICECandidate> m_pendingICECandidates;
 
     Vector<PendingTrackEvent> m_pendingTrackEvents;
 
-    HashMap<String, String> m_ipAddressToMDNSNameMap;
 #if !RELEASE_LOG_DISABLED
     Ref<const Logger> m_logger;
     const void* m_logIdentifier;
 #endif
     bool m_finishedGatheringCandidates { false };
-    uint64_t m_waitingForMDNSRegistration { 0 };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/mediastream/RTCController.cpp (282053 => 282054)


--- trunk/Source/WebCore/Modules/mediastream/RTCController.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/Modules/mediastream/RTCController.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -73,6 +73,10 @@
 
 void RTCController::add(RTCPeerConnection& connection)
 {
+    auto& document = downcast<Document>(*connection.scriptExecutionContext());
+    if (auto* networkManager = document.rtcNetworkManager())
+        networkManager->setICECandidateFiltering(!shouldDisableICECandidateFiltering(document));
+
     m_peerConnections.append(connection);
     if (shouldDisableICECandidateFiltering(downcast<Document>(*connection.scriptExecutionContext())))
         connection.disableICECandidateFiltering();
@@ -84,8 +88,13 @@
         return;
 
     m_shouldFilterICECandidates = false;
-    for (RTCPeerConnection& connection : m_peerConnections)
+    for (RTCPeerConnection& connection : m_peerConnections) {
+        if (auto* document = downcast<Document>(connection.scriptExecutionContext())) {
+            if (auto* networkManager = document->rtcNetworkManager())
+                networkManager->setICECandidateFiltering(false);
+        }
         connection.disableICECandidateFiltering();
+    }
 }
 
 void RTCController::disableICECandidateFilteringForDocument(Document& document)
@@ -93,11 +102,17 @@
     if (!LibWebRTCProvider::webRTCAvailable())
         return;
 
+    if (auto* networkManager = document.rtcNetworkManager())
+        networkManager->setICECandidateFiltering(false);
+
     m_filteringDisabledOrigins.append(PeerConnectionOrigin { document.topOrigin(), document.securityOrigin() });
     for (RTCPeerConnection& connection : m_peerConnections) {
         if (auto* peerConnectionDocument = downcast<Document>(connection.scriptExecutionContext())) {
-            if (matchDocumentOrigin(*peerConnectionDocument, document.topOrigin(), document.securityOrigin()))
+            if (matchDocumentOrigin(*peerConnectionDocument, document.topOrigin(), document.securityOrigin())) {
+                if (auto* networkManager = peerConnectionDocument->rtcNetworkManager())
+                    networkManager->setICECandidateFiltering(false);
                 connection.disableICECandidateFiltering();
+            }
         }
     }
 }
@@ -109,8 +124,13 @@
 
     m_filteringDisabledOrigins.clear();
     m_shouldFilterICECandidates = true;
-    for (RTCPeerConnection& connection : m_peerConnections)
+    for (RTCPeerConnection& connection : m_peerConnections) {
         connection.enableICECandidateFiltering();
+        if (auto* document = downcast<Document>(connection.scriptExecutionContext())) {
+            if (auto* networkManager = document->rtcNetworkManager())
+                networkManager->setICECandidateFiltering(true);
+        }
+    }
 }
 
 } // namespace WebCore

Added: trunk/Source/WebCore/Modules/mediastream/RTCNetworkManager.h (0 => 282054)


--- trunk/Source/WebCore/Modules/mediastream/RTCNetworkManager.h	                        (rev 0)
+++ trunk/Source/WebCore/Modules/mediastream/RTCNetworkManager.h	2021-09-06 08:49:02 UTC (rev 282054)
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2021 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 ENABLE(WEB_RTC)
+
+#include <wtf/ThreadSafeRefCounted.h>
+
+namespace WebCore {
+
+class RTCNetworkManager : public ThreadSafeRefCounted<RTCNetworkManager, WTF::DestructionThread::MainRunLoop> {
+public:
+    virtual ~RTCNetworkManager() = default;
+    virtual void setICECandidateFiltering(bool) = 0;
+    virtual void unregisterMDNSNames() = 0;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_RTC)

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp (282053 => 282054)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -92,15 +92,15 @@
     configuration.sdp_semantics = webrtc::SdpSemantics::kUnifiedPlan;
 
     if (!m_backend) {
+        auto& document = downcast<Document>(*m_peerConnectionBackend.connection().scriptExecutionContext());
         if (!m_rtcSocketFactory) {
-            auto& document = downcast<Document>(*m_peerConnectionBackend.connection().scriptExecutionContext());
             RegistrableDomain domain { document.url() };
             bool isFirstParty = domain == RegistrableDomain(document.firstPartyForCookies());
             m_rtcSocketFactory = client.createSocketFactory(document.userAgent(document.url()), isFirstParty, WTFMove(domain));
-            if (!m_peerConnectionBackend.shouldFilterICECandidates())
+            if (!m_peerConnectionBackend.shouldFilterICECandidates() && m_rtcSocketFactory)
                 m_rtcSocketFactory->disableRelay();
         }
-        m_backend = client.createPeerConnection(*this, m_rtcSocketFactory.get(), WTFMove(configuration));
+        m_backend = client.createPeerConnection(document.identifier(), *this, m_rtcSocketFactory.get(), WTFMove(configuration));
         return !!m_backend;
     }
     auto oldConfiguration = m_backend->GetConfiguration();

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (282053 => 282054)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -315,7 +315,7 @@
 {
     auto description = m_endpoint->currentLocalDescription();
     if (description)
-        description->setSdp(filterSDP(String(description->sdp())));
+        validateSDP(description->sdp());
     return description;
 }
 
@@ -328,7 +328,7 @@
 {
     auto description = m_endpoint->pendingLocalDescription();
     if (description)
-        description->setSdp(filterSDP(String(description->sdp())));
+        validateSDP(description->sdp());
     return description;
 }
 
@@ -341,7 +341,7 @@
 {
     auto description = m_endpoint->localDescription();
     if (description)
-        description->setSdp(filterSDP(String(description->sdp())));
+        validateSDP(description->sdp());
     return description;
 }
 

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (282053 => 282054)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-09-06 08:49:02 UTC (rev 282054)
@@ -1173,6 +1173,9 @@
 		41B8776223DE1045003638B8 /* RealtimeMediaSourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 41B8776023DE1042003638B8 /* RealtimeMediaSourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		41BBA866257E373B00AC7F6D /* SFrameUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 41209E24257A2FBB00120ACA /* SFrameUtils.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		41BF204922BA7BE80004F812 /* RealtimeVideoSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 41BF204022B947160004F812 /* RealtimeVideoSource.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		41C14BC626DE6DE800685BF5 /* RTCNetworkManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C14BC426DE6DE800685BF5 /* RTCNetworkManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		41C14BC726DE858400685BF5 /* LibWebRTCUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 41D1A04C213EDDFF0063FB6B /* LibWebRTCUtils.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		41C14BC926DF79D700685BF5 /* MDNSRegisterError.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C14BC826DF79D600685BF5 /* MDNSRegisterError.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		41C3B8A12649B1E0004ED4DE /* AudioMediaStreamTrackRendererInternalUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C3B89F2649B1B7004ED4DE /* AudioMediaStreamTrackRendererInternalUnit.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		41C3B8A22649B1E5004ED4DE /* AudioMediaStreamTrackRendererUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C3B89B2649B1B6004ED4DE /* AudioMediaStreamTrackRendererUnit.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		41C760B10EDE03D300C1655F /* ScriptState.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C760B00EDE03D300C1655F /* ScriptState.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -8048,6 +8051,8 @@
 		41BCE87725F7A67A0046C2E5 /* RTCTransformEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCTransformEvent.h; sourceTree = "<group>"; };
 		41BF204022B947160004F812 /* RealtimeVideoSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RealtimeVideoSource.h; sourceTree = "<group>"; };
 		41BF204222B947170004F812 /* RealtimeVideoSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RealtimeVideoSource.cpp; sourceTree = "<group>"; };
+		41C14BC426DE6DE800685BF5 /* RTCNetworkManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCNetworkManager.h; sourceTree = "<group>"; };
+		41C14BC826DF79D600685BF5 /* MDNSRegisterError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDNSRegisterError.h; sourceTree = "<group>"; };
 		41C3B89B2649B1B6004ED4DE /* AudioMediaStreamTrackRendererUnit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererUnit.h; sourceTree = "<group>"; };
 		41C3B89C2649B1B6004ED4DE /* AudioMediaStreamTrackRendererCocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererCocoa.h; sourceTree = "<group>"; };
 		41C3B89D2649B1B6004ED4DE /* AudioMediaStreamTrackRendererCocoa.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRendererCocoa.cpp; sourceTree = "<group>"; };
@@ -17259,6 +17264,7 @@
 				316DCB891E7A6996001B5F87 /* RTCIceTransport.idl */,
 				414516E026CC042100AAABE0 /* RTCIceTransportBackend.h */,
 				316DCB8E1E7A6C79001B5F87 /* RTCIceTransportState.idl */,
+				41C14BC426DE6DE800685BF5 /* RTCNetworkManager.h */,
 				073794DC19EE2C5200E5A045 /* RTCOfferAnswerOptions.h */,
 				316DCB121E78BE43001B5F87 /* RTCOfferAnswerOptions.idl */,
 				316DCB281E78F395001B5F87 /* RTCOfferOptions.h */,
@@ -17380,6 +17386,7 @@
 				07B7116B1D899E63009F0FFB /* CaptureDeviceManager.cpp */,
 				07B7116C1D899E63009F0FFB /* CaptureDeviceManager.h */,
 				5EBB89301C7777E100C65D41 /* IceCandidate.h */,
+				41C14BC826DF79D600685BF5 /* MDNSRegisterError.h */,
 				1BE5BFC11D515715001666D9 /* MediaConstraints.cpp */,
 				07221B9917CF0AD400848E51 /* MediaConstraints.h */,
 				41B28B131F8501A400FB52AC /* MediaEndpointConfiguration.cpp */,
@@ -33593,6 +33600,7 @@
 				4181C5CD2555836900AEB0FF /* LibWebRTCRtpTransformableFrame.h in Headers */,
 				4181C5D12555895600AEB0FF /* LibWebRTCRtpTransformBackend.h in Headers */,
 				410E4461234373E9000173D4 /* LibWebRTCSocketIdentifier.h in Headers */,
+				41C14BC726DE858400685BF5 /* LibWebRTCUtils.h in Headers */,
 				84730D911248F0B300D3A9C9 /* LightSource.h in Headers */,
 				B22279650D00BF220071B782 /* LinearGradientAttributes.h in Headers */,
 				AB31C91E10AE1B8E000C7B92 /* LineClampValue.h in Headers */,
@@ -33656,6 +33664,7 @@
 				439046EA12DA25E812AF80AC /* MathOperator.h in Headers */,
 				49D5DC2C0F423A73008F20FD /* Matrix3DTransformOperation.h in Headers */,
 				49E911C70EF86D47009D0CAF /* MatrixTransformOperation.h in Headers */,
+				41C14BC926DF79D700685BF5 /* MDNSRegisterError.h in Headers */,
 				5CBC8DAD1AAA302200E1C803 /* MediaAccessibilitySoftLink.h in Headers */,
 				931BCC611124DFCB00BE70DD /* MediaCanStartListener.h in Headers */,
 				CDCC9BCF22387E9A00FFB51C /* MediaCapabilitiesDecodingInfo.h in Headers */,
@@ -34470,6 +34479,7 @@
 				07AB996B18DA3C010018771E /* RTCIceServer.h in Headers */,
 				313591081E7DDC7300F30630 /* RTCIceTransportPolicy.h in Headers */,
 				313591091E7DDC7300F30630 /* RTCIceTransportState.h in Headers */,
+				41C14BC626DE6DE800685BF5 /* RTCNetworkManager.h in Headers */,
 				073794FE19F5864E00E5A045 /* RTCNotifiersMock.h in Headers */,
 				073794DE19EE2C5200E5A045 /* RTCOfferAnswerOptions.h in Headers */,
 				078E092517D14D1C00420AA1 /* RTCPeerConnection.h in Headers */,

Modified: trunk/Source/WebCore/dom/Document.cpp (282053 => 282054)


--- trunk/Source/WebCore/dom/Document.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/dom/Document.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -2596,12 +2596,9 @@
     if (m_hasPreparedForDestruction)
         return;
 
-#if USE(LIBWEBRTC)
-    // FIXME: This should be moved to Modules/mediastream.
-    if (LibWebRTCProvider::webRTCAvailable()) {
-        if (auto* page = this->page())
-            page->libWebRTCProvider().unregisterMDNSNames(identifier());
-    }
+#if ENABLE(WEB_RTC)
+    if (m_rtcNetworkManager)
+        m_rtcNetworkManager->unregisterMDNSNames();
 #endif
 
 #if ENABLE(SERVICE_WORKER)
@@ -5618,12 +5615,9 @@
             view->compositor().cancelCompositingLayerUpdate();
     }
 
-#if USE(LIBWEBRTC)
-    // FIXME: This should be moved to Modules/mediastream.
-    if (LibWebRTCProvider::webRTCAvailable()) {
-        if (auto* page = this->page())
-            page->libWebRTCProvider().unregisterMDNSNames(identifier());
-    }
+#if ENABLE(WEB_RTC)
+    if (m_rtcNetworkManager)
+        m_rtcNetworkManager->unregisterMDNSNames();
 #endif
 
 #if ENABLE(SERVICE_WORKER)

Modified: trunk/Source/WebCore/dom/Document.h (282053 => 282054)


--- trunk/Source/WebCore/dom/Document.h	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/dom/Document.h	2021-09-06 08:49:02 UTC (rev 282054)
@@ -49,6 +49,7 @@
 #include "PageIdentifier.h"
 #include "PlatformEvent.h"
 #include "PlaybackTargetClientContextIdentifier.h"
+#include "RTCNetworkManager.h"
 #include "ReferrerPolicy.h"
 #include "Region.h"
 #include "RegistrableDomain.h"
@@ -708,6 +709,11 @@
     SocketProvider* socketProvider() final;
     RefPtr<RTCDataChannelRemoteHandlerConnection> createRTCDataChannelRemoteHandlerConnection() final;
 
+#if ENABLE(WEB_RTC)
+    RTCNetworkManager* rtcNetworkManager() { return m_rtcNetworkManager.get(); }
+    void setRTCNetworkManager(Ref<RTCNetworkManager>&& rtcNetworkManager) { m_rtcNetworkManager = WTFMove(rtcNetworkManager); }
+#endif
+
     bool canNavigate(Frame* targetFrame, const URL& destinationURL = URL());
 
     bool usesStyleBasedEditability() const;
@@ -2221,6 +2227,10 @@
 
     ListHashSet<Ref<Element>> m_topLayerElements;
     UniqueRef<WhitespaceCache> m_whitespaceCache;
+
+#if ENABLE(WEB_RTC)
+    RefPtr<RTCNetworkManager> m_rtcNetworkManager;
+#endif
 };
 
 Element* eventTargetElementForDocument(Document*);

Copied: trunk/Source/WebCore/platform/mediastream/MDNSRegisterError.h (from rev 282053, trunk/Source/WebKit/WebProcess/Network/webrtc/WebRTCMonitor.h) (0 => 282054)


--- trunk/Source/WebCore/platform/mediastream/MDNSRegisterError.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/MDNSRegisterError.h	2021-09-06 08:49:02 UTC (rev 282054)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 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 <wtf/EnumTraits.h>
+
+namespace WebCore {
+
+enum class MDNSRegisterError { NotImplemented, BadParameter, DNSSD, Internal, Timeout };
+
+}
+
+namespace WTF {
+
+template<> struct EnumTraits<WebCore::MDNSRegisterError> {
+    using values = EnumValues<
+        WebCore::MDNSRegisterError,
+        WebCore::MDNSRegisterError::NotImplemented,
+        WebCore::MDNSRegisterError::BadParameter,
+        WebCore::MDNSRegisterError::DNSSD,
+        WebCore::MDNSRegisterError::Internal,
+        WebCore::MDNSRegisterError::Timeout
+    >;
+};
+
+}

Modified: trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp (282053 => 282054)


--- trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -299,7 +299,7 @@
     m_enableEnumeratingAllNetworkInterfaces = true;
 }
 
-rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
+rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(DocumentIdentifier, webrtc::PeerConnectionObserver& observer, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
 {
     // Default WK1 implementation.
     ASSERT(m_useNetworkThreadWithSocketServer);

Modified: trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h (282053 => 282054)


--- trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h	2021-09-06 08:49:02 UTC (rev 282054)
@@ -27,6 +27,7 @@
 
 #include "DocumentIdentifier.h"
 #include "LibWebRTCMacros.h"
+#include "MDNSRegisterError.h"
 #include "RTCDataChannelRemoteHandlerConnection.h"
 #include <wtf/CompletionHandler.h>
 #include <wtf/Expected.h>
@@ -66,8 +67,6 @@
 struct PeerConnectionFactoryAndThreads;
 struct RTCRtpCapabilities;
 
-enum class MDNSRegisterError { NotImplemented, BadParameter, DNSSD, Internal, Timeout };
-
 class WEBCORE_EXPORT LibWebRTCProvider {
     WTF_MAKE_FAST_ALLOCATED;
 public:
@@ -86,18 +85,10 @@
     using IPAddressOrError = Expected<String, MDNSRegisterError>;
     using MDNSNameOrError = Expected<String, MDNSRegisterError>;
 
-    virtual void unregisterMDNSNames(DocumentIdentifier) { }
-
-    virtual void registerMDNSName(DocumentIdentifier, const String& ipAddress, CompletionHandler<void(MDNSNameOrError&&)>&& callback)
-    {
-        UNUSED_PARAM(ipAddress);
-        callback(makeUnexpected(MDNSRegisterError::NotImplemented));
-    }
-
     virtual RefPtr<RTCDataChannelRemoteHandlerConnection> createRTCDataChannelRemoteHandlerConnection() { return nullptr; }
 
 #if USE(LIBWEBRTC)
-    virtual rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&&);
+    virtual rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(DocumentIdentifier, webrtc::PeerConnectionObserver&, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&&);
 
     webrtc::PeerConnectionFactoryInterface* factory();
 
@@ -123,6 +114,8 @@
     bool isSupportingVP9VTB() const { return m_supportsVP9VTB; }
     virtual void disableNonLocalhostConnections() { m_disableNonLocalhostConnections = true; }
 
+    bool isSupportingMDNS() const { return m_supportsMDNS; }
+
     // Callback is executed on a background thread.
     void prepareCertificateGenerator(Function<void(rtc::RTCCertificateGenerator&)>&&);
 
@@ -168,6 +161,7 @@
     bool m_supportsVP9Profile2 { false };
     bool m_supportsVP9VTB { false };
     bool m_useDTLS10 { false };
+    bool m_supportsMDNS { false };
 #endif
 };
 
@@ -180,16 +174,3 @@
 #endif
 
 } // namespace WebCore
-
-namespace WTF {
-template<> struct EnumTraits<WebCore::MDNSRegisterError> {
-    using values = EnumValues<
-        WebCore::MDNSRegisterError,
-        WebCore::MDNSRegisterError::NotImplemented,
-        WebCore::MDNSRegisterError::BadParameter,
-        WebCore::MDNSRegisterError::DNSSD,
-        WebCore::MDNSRegisterError::Internal,
-        WebCore::MDNSRegisterError::Timeout
-    >;
-};
-}

Modified: trunk/Source/WebKit/ChangeLog (282053 => 282054)


--- trunk/Source/WebKit/ChangeLog	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/ChangeLog	2021-09-06 08:49:02 UTC (rev 282054)
@@ -1,3 +1,56 @@
+2021-09-06  Youenn Fablet  <[email protected]>
+
+        Implement libwebrtc network manager GetMdnsResponder
+        https://bugs.webkit.org/show_bug.cgi?id=229757
+
+        Reviewed by Eric Carlson.
+
+        Implement RTCNetworkManager API in LibWebRTCNetworkManager to handle per-document mDNS registrations.
+        Move part of WebRTCMonitor to LibWebRTCNetworkManager.
+        LibWebRTCNetworkManager is a WebRTCMonitor observer to get the list of networks.
+        Since libwebrtc is now doing the mDNS registration, we need to return a mDNS name even if registration failed.
+        We update WebMDNSRegister and NetworkMDNSRegister accordingly.
+
+        * NetworkProcess/webrtc/NetworkMDNSRegister.cpp:
+        (WebKit::registerMDNSNameCallback):
+        (WebKit::NetworkMDNSRegister::registerMDNSName):
+        * Sources.txt:
+        * WebKit.xcodeproj/project.pbxproj:
+        * WebProcess/Network/webrtc/LibWebRTCNetworkManager.cpp: Added.
+        (WebKit::LibWebRTCNetworkManager::getOrCreate):
+        (WebKit::LibWebRTCNetworkManager::LibWebRTCNetworkManager):
+        (WebKit::LibWebRTCNetworkManager::~LibWebRTCNetworkManager):
+        (WebKit::LibWebRTCNetworkManager::unregisterMDNSNames):
+        (WebKit::LibWebRTCNetworkManager::StartUpdating):
+        (WebKit::LibWebRTCNetworkManager::StopUpdating):
+        (WebKit::LibWebRTCNetworkManager::GetMdnsResponder const):
+        (WebKit::LibWebRTCNetworkManager::networksChanged):
+        (WebKit::LibWebRTCNetworkManager::networkProcessCrashed):
+        (WebKit::LibWebRTCNetworkManager::CreateNameForAddress):
+        (WebKit::LibWebRTCNetworkManager::RemoveNameForAddress):
+        * WebProcess/Network/webrtc/LibWebRTCNetworkManager.h: Added.
+        * WebProcess/Network/webrtc/LibWebRTCProvider.cpp:
+        (WebKit::LibWebRTCProvider::createPeerConnection):
+        (WebKit::LibWebRTCProvider::disableNonLocalhostConnections):
+        * WebProcess/Network/webrtc/LibWebRTCProvider.h:
+        * WebProcess/Network/webrtc/WebMDNSRegister.cpp:
+        (WebKit::WebMDNSRegister::finishedRegisteringMDNSName):
+        (WebKit::WebMDNSRegister::registerMDNSName):
+        * WebProcess/Network/webrtc/WebMDNSRegister.h:
+        * WebProcess/Network/webrtc/WebMDNSRegister.messages.in:
+        * WebProcess/Network/webrtc/WebRTCMonitor.cpp:
+        (WebKit::WebRTCMonitor::startUpdating):
+        (WebKit::WebRTCMonitor::stopUpdating):
+        (WebKit::WebRTCMonitor::networksChanged):
+        (WebKit::WebRTCMonitor::networkProcessCrashed):
+        * WebProcess/Network/webrtc/WebRTCMonitor.h:
+        (WebKit::WebRTCMonitor::addObserver):
+        (WebKit::WebRTCMonitor::removeObserver):
+        (WebKit::WebRTCMonitor::didReceiveNetworkList const):
+        (WebKit::WebRTCMonitor::networkList const):
+        (WebKit::WebRTCMonitor::ipv4 const):
+        (WebKit::WebRTCMonitor::ipv6 const):
+
 2021-09-05  Simon Fraser  <[email protected]>
 
         Use a strongly typed identifier for authentication challenge IDs

Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.cpp (282053 => 282054)


--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -98,14 +98,16 @@
     MDNS_RELEASE_LOG_IN_CALLBACK(request->sessionID, "registerMDNSNameCallback with error %d", errorCode);
 
     if (errorCode) {
-        request->connection->send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { request->requestIdentifier, makeUnexpected(WebCore::MDNSRegisterError::DNSSD) }, 0);
+        request->connection->send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { request->requestIdentifier, request->name, WebCore::MDNSRegisterError::DNSSD }, 0);
         return;
     }
-    request->connection->send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { request->requestIdentifier, request->name }, 0);
+    request->connection->send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { request->requestIdentifier, request->name, { } }, 0);
 }
 
 void NetworkMDNSRegister::registerMDNSName(MDNSRegisterIdentifier requestIdentifier, WebCore::DocumentIdentifier documentIdentifier, const String& ipAddress)
 {
+    auto name = makeString(createCanonicalUUIDString(), ".local");
+
     DNSServiceRef service;
     auto iterator = m_services.find(documentIdentifier);
     if (iterator == m_services.end()) {
@@ -112,13 +114,13 @@
         auto error = DNSServiceCreateConnection(&service);
         if (error) {
             MDNS_RELEASE_LOG("registerMDNSName DNSServiceCreateConnection error %d", error);
-            m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, makeUnexpected(WebCore::MDNSRegisterError::DNSSD) }, 0);
+            m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, name, WebCore::MDNSRegisterError::DNSSD }, 0);
             return;
         }
         error = DNSServiceSetDispatchQueue(service, dispatch_get_main_queue());
         if (error) {
             MDNS_RELEASE_LOG("registerMDNSName DNSServiceCreateConnection error %d", error);
-            m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, makeUnexpected(WebCore::MDNSRegisterError::DNSSD) }, 0);
+            m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, name, WebCore::MDNSRegisterError::DNSSD }, 0);
             return;
         }
         ASSERT(service);
@@ -126,13 +128,12 @@
     } else
         service = iterator->value;
 
-    auto name = makeString(createCanonicalUUIDString(), ".local");
-
     auto ip = inet_addr(ipAddress.utf8().data());
 
+    // FIXME: Add IPv6 support.
     if (ip == ( in_addr_t)(-1)) {
         MDNS_RELEASE_LOG("registerMDNSName inet_addr error");
-        m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, makeUnexpected(WebCore::MDNSRegisterError::BadParameter) }, 0);
+        m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, name, WebCore::MDNSRegisterError::BadParameter }, 0);
         return;
     }
 
@@ -156,7 +157,7 @@
         reinterpret_cast<void*>(pendingRegistrationRequestCount));
     if (error) {
         MDNS_RELEASE_LOG("registerMDNSName DNSServiceRegisterRecord error %d", error);
-        m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, makeUnexpected(WebCore::MDNSRegisterError::DNSSD) }, 0);
+        m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, pendingRequest->name, WebCore::MDNSRegisterError::DNSSD }, 0);
         return;
     }
     pendingRegistrationRequests().add(pendingRegistrationRequestCount++, WTFMove(pendingRequest));
@@ -171,7 +172,9 @@
 void NetworkMDNSRegister::registerMDNSName(MDNSRegisterIdentifier requestIdentifier, WebCore::DocumentIdentifier documentIdentifier, const String& ipAddress)
 {
     MDNS_RELEASE_LOG("registerMDNSName not implemented");
-    m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, makeUnexpected(WebCore::MDNSRegisterError::NotImplemented) }, 0);
+    auto name = makeString(createCanonicalUUIDString(), ".local");
+
+    m_connection.connection().send(Messages::WebMDNSRegister::FinishedRegisteringMDNSName { requestIdentifier, name, WebCore::MDNSRegisterError::NotImplemented }, 0);
 }
 
 #endif

Modified: trunk/Source/WebKit/Sources.txt (282053 => 282054)


--- trunk/Source/WebKit/Sources.txt	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/Sources.txt	2021-09-06 08:49:02 UTC (rev 282054)
@@ -640,6 +640,7 @@
 WebProcess/Network/WebSocketStream.cpp
 
 WebProcess/Network/webrtc/LibWebRTCNetwork.cpp
+WebProcess/Network/webrtc/LibWebRTCNetworkManager.cpp
 WebProcess/Network/webrtc/LibWebRTCProvider.cpp
 WebProcess/Network/webrtc/LibWebRTCResolver.cpp
 WebProcess/Network/webrtc/LibWebRTCSocket.cpp

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (282053 => 282054)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2021-09-06 08:49:02 UTC (rev 282054)
@@ -3853,6 +3853,8 @@
 		41B7ED6F206965900087D853 /* NetworkMDNSRegister.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkMDNSRegister.cpp; sourceTree = "<group>"; };
 		41B7ED70206965900087D853 /* NetworkMDNSRegister.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkMDNSRegister.h; sourceTree = "<group>"; };
 		41B7ED71206965900087D853 /* NetworkMDNSRegister.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NetworkMDNSRegister.messages.in; sourceTree = "<group>"; };
+		41C14BC226DE6A2F00685BF5 /* LibWebRTCNetworkManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCNetworkManager.cpp; path = Network/webrtc/LibWebRTCNetworkManager.cpp; sourceTree = "<group>"; };
+		41C14BC326DE6A2F00685BF5 /* LibWebRTCNetworkManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LibWebRTCNetworkManager.h; path = Network/webrtc/LibWebRTCNetworkManager.h; sourceTree = "<group>"; };
 		41C3B88526444AAB004ED4DE /* AudioMediaStreamTrackRendererInternalUnitManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererInternalUnitManager.h; sourceTree = "<group>"; };
 		41C3B88626444AAC004ED4DE /* AudioMediaStreamTrackRendererInternalUnitManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRendererInternalUnitManager.cpp; sourceTree = "<group>"; };
 		41C3B88726444AD3004ED4DE /* AudioMediaStreamTrackRendererInternalUnitIdentifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererInternalUnitIdentifier.h; sourceTree = "<group>"; };
@@ -8520,6 +8522,8 @@
 				416F8089245C7FF500B68F02 /* LibWebRTCNetwork.cpp */,
 				411B22621E371244004F7363 /* LibWebRTCNetwork.h */,
 				416F8086245B397400B68F02 /* LibWebRTCNetwork.messages.in */,
+				41C14BC226DE6A2F00685BF5 /* LibWebRTCNetworkManager.cpp */,
+				41C14BC326DE6A2F00685BF5 /* LibWebRTCNetworkManager.h */,
 				413075A71DE85EE70039EC69 /* LibWebRTCProvider.cpp */,
 				413075A81DE85EE70039EC69 /* LibWebRTCProvider.h */,
 				41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */,

Added: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetworkManager.cpp (0 => 282054)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetworkManager.cpp	                        (rev 0)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetworkManager.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2021 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 "config.h"
+#include "LibWebRTCNetworkManager.h"
+
+#if USE(LIBWEBRTC)
+
+#include "LibWebRTCNetwork.h"
+#include "Logging.h"
+#include "WebProcess.h"
+#include <WebCore/Document.h>
+#include <WebCore/LibWebRTCUtils.h>
+
+namespace WebKit {
+using namespace WebCore;
+
+LibWebRTCNetworkManager* LibWebRTCNetworkManager::getOrCreate(WebCore::DocumentIdentifier identifier)
+{
+    auto* document = Document::allDocumentsMap().get(identifier);
+    if (!document)
+        return nullptr;
+
+    auto* networkManager = static_cast<LibWebRTCNetworkManager*>(document->rtcNetworkManager());
+    if (!networkManager) {
+        auto newNetworkManager = adoptRef(*new LibWebRTCNetworkManager(identifier));
+        networkManager = newNetworkManager.ptr();
+        document->setRTCNetworkManager(WTFMove(newNetworkManager));
+    }
+
+    return networkManager;
+}
+
+LibWebRTCNetworkManager::LibWebRTCNetworkManager(WebCore::DocumentIdentifier documentIdentifier)
+    : m_documentIdentifier(documentIdentifier)
+{
+    WebProcess::singleton().libWebRTCNetwork().monitor().addObserver(*this);
+}
+
+LibWebRTCNetworkManager::~LibWebRTCNetworkManager()
+{
+    WebProcess::singleton().libWebRTCNetwork().monitor().removeObserver(*this);
+}
+
+void LibWebRTCNetworkManager::unregisterMDNSNames()
+{
+    WebProcess::singleton().libWebRTCNetwork().mdnsRegister().unregisterMDNSNames(m_documentIdentifier);
+}
+
+void LibWebRTCNetworkManager::StartUpdating()
+{
+    callOnMainRunLoop([this, weakThis = makeWeakPtr(this)] {
+        if (!weakThis)
+            return;
+
+        auto& monitor = WebProcess::singleton().libWebRTCNetwork().monitor();
+        if (m_receivedNetworkList) {
+            WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this, protectedThis = makeRef(*this)] {
+                SignalNetworksChanged();
+            });
+        } else if (monitor.didReceiveNetworkList())
+            networksChanged(monitor.networkList() , monitor.ipv4(), monitor.ipv6());
+        monitor.startUpdating();
+    });
+}
+
+void LibWebRTCNetworkManager::StopUpdating()
+{
+    callOnMainRunLoop([weakThis = makeWeakPtr(this)] {
+        if (!weakThis)
+            return;
+        WebProcess::singleton().libWebRTCNetwork().monitor().stopUpdating();
+    });
+}
+
+webrtc::MdnsResponderInterface* LibWebRTCNetworkManager::GetMdnsResponder() const
+{
+    return m_useMDNSCandidates ? const_cast<LibWebRTCNetworkManager*>(this) : nullptr;
+}
+
+void LibWebRTCNetworkManager::networksChanged(const Vector<RTCNetwork>& networks, const RTCNetwork::IPAddress& ipv4, const RTCNetwork::IPAddress& ipv6)
+{
+    bool forceSignaling = !m_receivedNetworkList;
+    m_receivedNetworkList = true;
+
+    WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this, protectedThis = makeRef(*this), networks, ipv4, ipv6, forceSignaling] {
+        std::vector<rtc::Network*> networkList(networks.size());
+        for (size_t index = 0; index < networks.size(); ++index)
+            networkList[index] = new rtc::Network(networks[index].value());
+
+        bool hasChanged;
+        set_default_local_addresses(ipv4.value, ipv6.value);
+        MergeNetworkList(networkList, &hasChanged);
+        if (hasChanged || forceSignaling)
+            SignalNetworksChanged();
+    });
+
+}
+
+void LibWebRTCNetworkManager::networkProcessCrashed()
+{
+    m_receivedNetworkList = false;
+    if (!WebCore::LibWebRTCProvider::hasWebRTCThreads())
+        return;
+
+    // In case we have clients waiting for networksChanged, we call SignalNetworksChanged to make sure they do not wait for nothing.
+    WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this, protectedThis = makeRef(*this)] {
+        SignalNetworksChanged();
+    });
+}
+
+void LibWebRTCNetworkManager::CreateNameForAddress(const rtc::IPAddress& address, NameCreatedCallback callback)
+{
+    callOnMainRunLoop([weakThis = makeWeakPtr(this), address, callback = WTFMove(callback)]() mutable {
+        if (!weakThis)
+            return;
+
+        WebProcess::singleton().libWebRTCNetwork().mdnsRegister().registerMDNSName(weakThis->m_documentIdentifier, fromStdString(address.ToString()), [address, callback = WTFMove(callback)](auto name, auto error) mutable {
+            WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([address, callback = WTFMove(callback), name = WTFMove(name).isolatedCopy(), error] {
+                RELEASE_LOG_ERROR_IF(error, WebRTC, "MDNS registration of a host candidate failed with error %d", *error);
+                // In case of error, we provide the name to let gathering complete.
+                callback(address, name.utf8().data());
+            });
+        });
+    });
+}
+
+void LibWebRTCNetworkManager::RemoveNameForAddress(const rtc::IPAddress&, NameRemovedCallback)
+{
+    // LibWebRTC backend defines this method but does not call it.
+    ASSERT_NOT_REACHED();
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)

Copied: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetworkManager.h (from rev 282053, trunk/Source/WebKit/WebProcess/Network/webrtc/WebRTCMonitor.h) (0 => 282054)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetworkManager.h	                        (rev 0)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetworkManager.h	2021-09-06 08:49:02 UTC (rev 282054)
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2021 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 "WebRTCMonitor.h"
+#include <WebCore/DocumentIdentifier.h>
+#include <WebCore/LibWebRTCProvider.h>
+#include <WebCore/RTCNetworkManager.h>
+
+namespace WebKit {
+
+class LibWebRTCNetworkManager final : public WebCore::RTCNetworkManager, public rtc::NetworkManagerBase, public webrtc::MdnsResponderInterface, public WebRTCMonitor::Observer {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    static LibWebRTCNetworkManager* getOrCreate(WebCore::DocumentIdentifier);
+    ~LibWebRTCNetworkManager();
+
+private:
+    explicit LibWebRTCNetworkManager(WebCore::DocumentIdentifier);
+
+    // WebCore::RTCNetworkManager
+    void setICECandidateFiltering(bool doFiltering) final { m_useMDNSCandidates = doFiltering; }
+    void unregisterMDNSNames() final;
+
+    // webrtc::NetworkManagerBase
+    void StartUpdating() final;
+    void StopUpdating() final;
+    webrtc::MdnsResponderInterface* GetMdnsResponder() const final;
+
+    // webrtc::MdnsResponderInterface
+    void CreateNameForAddress(const rtc::IPAddress&, NameCreatedCallback);
+    void RemoveNameForAddress(const rtc::IPAddress&, NameRemovedCallback);
+
+    // WebRTCMonitor::Observer
+    void networksChanged(const Vector<RTCNetwork>&, const RTCNetwork::IPAddress&, const RTCNetwork::IPAddress&) final;
+    void networkProcessCrashed() final;
+
+    WebCore::DocumentIdentifier m_documentIdentifier;
+    bool m_useMDNSCandidates { true };
+    bool m_receivedNetworkList { false };
+};
+
+} // namespace WebKit
+
+#endif

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp (282053 => 282054)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -33,6 +33,7 @@
 #endif
 
 #include "LibWebRTCNetwork.h"
+#include "LibWebRTCNetworkManager.h"
 #include "RTCDataChannelRemoteManager.h"
 #include "WebPage.h"
 #include "WebProcess.h"
@@ -54,7 +55,7 @@
     }
 };
 
-rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, rtc::PacketSocketFactory* socketFactory, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
+rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(DocumentIdentifier identifier, webrtc::PeerConnectionObserver& observer, rtc::PacketSocketFactory* socketFactory, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
 {
 #if ENABLE(GPU_PROCESS) && PLATFORM(COCOA) && !PLATFORM(MACCATALYST)
     if (!m_didInitializeCallback) {
@@ -67,7 +68,12 @@
 
     auto& networkMonitor = WebProcess::singleton().libWebRTCNetwork().monitor();
     networkMonitor.setEnumeratingAllNetworkInterfacesEnabled(isEnumeratingAllNetworkInterfacesEnabled());
-    return WebCore::LibWebRTCProvider::createPeerConnection(observer, networkMonitor, *socketFactory, WTFMove(configuration), makeUnique<AsyncResolverFactory>());
+
+    auto* networkManager = LibWebRTCNetworkManager::getOrCreate(identifier);
+    if (!networkManager)
+        return nullptr;
+
+    return WebCore::LibWebRTCProvider::createPeerConnection(observer, *networkManager, *socketFactory, WTFMove(configuration), makeUnique<AsyncResolverFactory>());
 }
 
 void LibWebRTCProvider::disableNonLocalhostConnections()
@@ -75,16 +81,6 @@
     WebProcess::singleton().libWebRTCNetwork().disableNonLocalhostConnections();
 }
 
-void LibWebRTCProvider::unregisterMDNSNames(DocumentIdentifier documentIdentifier)
-{
-    WebProcess::singleton().libWebRTCNetwork().mdnsRegister().unregisterMDNSNames(documentIdentifier);
-}
-
-void LibWebRTCProvider::registerMDNSName(DocumentIdentifier documentIdentifier, const String& ipAddress, CompletionHandler<void(MDNSNameOrError&&)>&& callback)
-{
-    WebProcess::singleton().libWebRTCNetwork().mdnsRegister().registerMDNSName(documentIdentifier, ipAddress, WTFMove(callback));
-}
-
 class RTCSocketFactory final : public LibWebRTCProvider::SuspendableSocketFactory {
     WTF_MAKE_FAST_ALLOCATED;
 public:

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h (282053 => 282054)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h	2021-09-06 08:49:02 UTC (rev 282054)
@@ -54,10 +54,8 @@
 private:
     std::unique_ptr<SuspendableSocketFactory> createSocketFactory(String&& /* userAgent */, bool /* isFirstParty */, WebCore::RegistrableDomain&&) final;
 
-    rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&&) final;
+    rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(WebCore::DocumentIdentifier, webrtc::PeerConnectionObserver&, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&&) final;
 
-    void unregisterMDNSNames(WebCore::DocumentIdentifier) final;
-    void registerMDNSName(WebCore::DocumentIdentifier, const String& ipAddress, CompletionHandler<void(MDNSNameOrError&&)>&&) final;
     void disableNonLocalhostConnections() final;
     void startedNetworkThread() final;
     RefPtr<WebCore::RTCDataChannelRemoteHandlerConnection> createRTCDataChannelRemoteHandlerConnection() final;
@@ -73,6 +71,7 @@
     : m_webPage(webPage)
 {
     m_useNetworkThreadWithSocketServer = false;
+    m_supportsMDNS = true;
 }
 
 inline UniqueRef<LibWebRTCProvider> createLibWebRTCProvider(WebPage& page)

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.cpp (282053 => 282054)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -36,22 +36,22 @@
 namespace WebKit {
 using namespace WebCore;
 
-void WebMDNSRegister::finishedRegisteringMDNSName(MDNSRegisterIdentifier identifier, LibWebRTCProvider::MDNSNameOrError&& result)
+void WebMDNSRegister::finishedRegisteringMDNSName(MDNSRegisterIdentifier identifier, String&& name, std::optional<MDNSRegisterError> error)
 {
     auto pendingRegistration = m_pendingRegistrations.take(identifier);
     if (!pendingRegistration.callback)
         return;
 
-    if (result.has_value()) {
+    if (!error) {
         auto iterator = m_registeringDocuments.find(pendingRegistration.documentIdentifier);
         if (iterator == m_registeringDocuments.end()) {
-            pendingRegistration.callback(makeUnexpected(WebCore::MDNSRegisterError::DNSSD));
+            pendingRegistration.callback(name, WebCore::MDNSRegisterError::DNSSD);
             return;
         }
-        iterator->value.add(pendingRegistration.ipAddress, result.value());
+        iterator->value.add(pendingRegistration.ipAddress, name);
     }
 
-    pendingRegistration.callback(WTFMove(result));
+    pendingRegistration.callback(name, error);
 }
 
 void WebMDNSRegister::unregisterMDNSNames(DocumentIdentifier identifier)
@@ -63,7 +63,7 @@
     connection.send(Messages::NetworkMDNSRegister::UnregisterMDNSNames { identifier }, 0);
 }
 
-void WebMDNSRegister::registerMDNSName(DocumentIdentifier identifier, const String& ipAddress, CompletionHandler<void(LibWebRTCProvider::MDNSNameOrError&&)>&& callback)
+void WebMDNSRegister::registerMDNSName(DocumentIdentifier identifier, const String& ipAddress, CompletionHandler<void(const String&, std::optional<MDNSRegisterError>)>&& callback)
 {
     auto& map = m_registeringDocuments.ensure(identifier, [] {
         return HashMap<String, String> { };
@@ -71,7 +71,7 @@
 
     auto iterator = map.find(ipAddress);
     if (iterator != map.end()) {
-        callback(iterator->value);
+        callback(iterator->value, { });
         return;
     }
 
@@ -78,9 +78,10 @@
     auto requestIdentifier = MDNSRegisterIdentifier::generate();
     m_pendingRegistrations.add(requestIdentifier, PendingRegistration { WTFMove(callback), identifier, ipAddress });
 
+    // FIXME: Use async reply.
     auto& connection = WebProcess::singleton().ensureNetworkProcessConnection().connection();
     if (!connection.send(Messages::NetworkMDNSRegister::RegisterMDNSName { requestIdentifier, identifier, ipAddress }, 0))
-        finishedRegisteringMDNSName(requestIdentifier, makeUnexpected(MDNSRegisterError::Internal));
+        finishedRegisteringMDNSName(requestIdentifier, { }, MDNSRegisterError::Internal);
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.h (282053 => 282054)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.h	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.h	2021-09-06 08:49:02 UTC (rev 282054)
@@ -46,15 +46,15 @@
     WebMDNSRegister() = default;
 
     void unregisterMDNSNames(WebCore::DocumentIdentifier);
-    void registerMDNSName(WebCore::DocumentIdentifier, const String& ipAddress, CompletionHandler<void(WebCore::LibWebRTCProvider::MDNSNameOrError&&)>&&);
+    void registerMDNSName(WebCore::DocumentIdentifier, const String& ipAddress, CompletionHandler<void(const String&, std::optional<WebCore::MDNSRegisterError>)>&&);
 
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
 
 private:
-    void finishedRegisteringMDNSName(MDNSRegisterIdentifier, WebCore::LibWebRTCProvider::MDNSNameOrError&&);
+    void finishedRegisteringMDNSName(MDNSRegisterIdentifier, String&&, std::optional<WebCore::MDNSRegisterError>);
 
     struct PendingRegistration {
-        CompletionHandler<void(WebCore::LibWebRTCProvider::MDNSNameOrError&&)> callback;
+        CompletionHandler<void(const String&, std::optional<WebCore::MDNSRegisterError>)> callback;
         WebCore::DocumentIdentifier documentIdentifier;
         String ipAddress;
     };

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.messages.in (282053 => 282054)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.messages.in	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.messages.in	2021-09-06 08:49:02 UTC (rev 282054)
@@ -1,4 +1,4 @@
-# Copyright (C) 2018 Apple Inc. All rights reserved.
+# Copyright (C) 2018-2021 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -23,7 +23,7 @@
 #if ENABLE(WEB_RTC)
 
 messages -> WebMDNSRegister NotRefCounted {
-    void FinishedRegisteringMDNSName(WebKit::MDNSRegisterIdentifier identifier, WebCore::LibWebRTCProvider::MDNSNameOrError result)
+    void FinishedRegisteringMDNSName(WebKit::MDNSRegisterIdentifier identifier, String mdnsName, std::optional<WebCore::MDNSRegisterError> error)
 }
 
 #endif // ENABLE(WEB_RTC)

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/WebRTCMonitor.cpp (282053 => 282054)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/WebRTCMonitor.cpp	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/WebRTCMonitor.cpp	2021-09-06 08:49:02 UTC (rev 282054)
@@ -33,8 +33,6 @@
 #include "NetworkProcessConnection.h"
 #include "NetworkRTCMonitorMessages.h"
 #include "WebProcess.h"
-#include <WebCore/LibWebRTCMacros.h>
-#include <webrtc/rtc_base/net_helpers.h>
 #include <wtf/MainThread.h>
 
 namespace WebKit {
@@ -53,67 +51,43 @@
     m_enableEnumeratingAllNetworkInterfaces = enabled;
 }
 
-void WebRTCMonitor::StartUpdating()
+void WebRTCMonitor::startUpdating()
 {
-    WEBRTC_RELEASE_LOG("StartUpdating");
-    if (m_receivedNetworkList) {
-        WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this] {
-            SignalNetworksChanged();
-        });
-    }
+    WEBRTC_RELEASE_LOG("StartUpdating - Asking network process to start updating");
 
-    sendOnMainThread([this](auto& connection) {
-        WEBRTC_RELEASE_LOG("StartUpdating - Asking network process to start updating");
-        connection.send(Messages::NetworkRTCMonitor::StartUpdatingIfNeeded(m_enableEnumeratingAllNetworkInterfaces), 0);
-    });
+    WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkRTCMonitor::StartUpdatingIfNeeded(m_enableEnumeratingAllNetworkInterfaces), 0);
     ++m_clientCount;
 }
 
-void WebRTCMonitor::StopUpdating()
+void WebRTCMonitor::stopUpdating()
 {
     WEBRTC_RELEASE_LOG("StopUpdating");
+
     ASSERT(m_clientCount);
     if (--m_clientCount)
         return;
 
-    sendOnMainThread([this](auto& connection) {
-        WEBRTC_RELEASE_LOG("StopUpdating - Asking network process to stop updating");
-        connection.send(Messages::NetworkRTCMonitor::StopUpdating(), 0);
-    });
+    WEBRTC_RELEASE_LOG("StopUpdating - Asking network process to stop updating");
+    WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkRTCMonitor::StopUpdating(), 0);
 }
 
-void WebRTCMonitor::networksChanged(const Vector<RTCNetwork>& networks, const RTCNetwork::IPAddress& ipv4, const RTCNetwork::IPAddress& ipv6)
+void WebRTCMonitor::networksChanged(Vector<RTCNetwork>&& networkList, RTCNetwork::IPAddress&& ipv4, RTCNetwork::IPAddress&& ipv6)
 {
     WEBRTC_RELEASE_LOG("networksChanged");
-    // No need to protect 'this' as it has the lifetime of LibWebRTC which has the lifetime of the web process.
-    WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this, networks, ipv4, ipv6] {
-        WEBRTC_RELEASE_LOG("networksChanged - Signaling");
-        std::vector<rtc::Network*> networkList(networks.size());
-        for (size_t index = 0; index < networks.size(); ++index)
-            networkList[index] = new rtc::Network(networks[index].value());
 
-        bool forceSignaling = !m_receivedNetworkList;
-        m_receivedNetworkList = true;
+    m_didReceiveNetworkList = true;
+    m_networkList = WTFMove(networkList);
+    m_ipv4 = WTFMove(ipv4);
+    m_ipv6 = WTFMove(ipv6);
 
-        bool hasChanged;
-        set_default_local_addresses(ipv4.value, ipv6.value);
-        MergeNetworkList(networkList, &hasChanged);
-        if (hasChanged || forceSignaling)
-            SignalNetworksChanged();
-
-    });
+    for (auto& observer : m_observers)
+        observer.networksChanged(m_networkList, m_ipv4, m_ipv6);
 }
 
 void WebRTCMonitor::networkProcessCrashed()
 {
-    m_receivedNetworkList = false;
-    if (!WebCore::LibWebRTCProvider::hasWebRTCThreads())
-        return;
-
-    // In case we have clients waiting for networksChanged, we call SignalNetworksChanged to make sure they do not wait for nothing.    
-    WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this] {
-        SignalNetworksChanged();
-    });
+    for (auto& observer : m_observers)
+        observer.networkProcessCrashed();
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/WebRTCMonitor.h (282053 => 282054)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/WebRTCMonitor.h	2021-09-06 07:54:25 UTC (rev 282053)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/WebRTCMonitor.h	2021-09-06 08:49:02 UTC (rev 282054)
@@ -30,6 +30,7 @@
 #include "RTCNetwork.h"
 #include <WebCore/LibWebRTCProvider.h>
 #include <wtf/Forward.h>
+#include <wtf/WeakHashSet.h>
 
 namespace IPC {
 class Connection;
@@ -40,26 +41,42 @@
 
 struct NetworksChangedData;
 
-class WebRTCMonitor final : public rtc::NetworkManagerBase {
+class WebRTCMonitor {
 public:
     WebRTCMonitor() = default;
 
+    class Observer : public CanMakeWeakPtr<Observer> {
+    public:
+        virtual ~Observer() = default;
+        virtual void networksChanged(const Vector<RTCNetwork>&, const RTCNetwork::IPAddress&, const RTCNetwork::IPAddress&) = 0;
+        virtual void networkProcessCrashed() = 0;
+    };
+    void addObserver(Observer& observer) { m_observers.add(observer); }
+    void removeObserver(Observer& observer) { m_observers.remove(observer); }
+    void startUpdating();
+    void stopUpdating();
+
     void networkProcessCrashed();
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
     void setEnumeratingAllNetworkInterfacesEnabled(bool);
 
+    bool didReceiveNetworkList() const { return m_didReceiveNetworkList; }
+    const Vector<RTCNetwork>& networkList() const { return m_networkList; }
+    const RTCNetwork::IPAddress& ipv4() const { return m_ipv4; }
+    const RTCNetwork::IPAddress& ipv6() const { return m_ipv6; }
+
 private:
-    void networksChanged(const Vector<RTCNetwork>& networkList, const RTCNetwork::IPAddress&, const RTCNetwork::IPAddress&);
+    void networksChanged(Vector<RTCNetwork>&&, RTCNetwork::IPAddress&&, RTCNetwork::IPAddress&&);
 
-    void StartUpdating() final;
-    void StopUpdating() final;
-    webrtc::MdnsResponderInterface* GetMdnsResponder() const final { return nullptr; }
-
     static void sendOnMainThread(Function<void(IPC::Connection&)>&&);
 
     unsigned m_clientCount { 0 };
-    bool m_receivedNetworkList { false };
+    WeakHashSet<Observer> m_observers;
     bool m_enableEnumeratingAllNetworkInterfaces { false };
+    bool m_didReceiveNetworkList { false };
+    Vector<RTCNetwork> m_networkList;
+    RTCNetwork::IPAddress m_ipv4;
+    RTCNetwork::IPAddress m_ipv6;
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to