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